/*
n m q n个投票者 m个作品 q次事件
事件
*/
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
#define DEBUG
// using ll=long long;
inline int read()
{
    int c=getchar(), f=1, x=0;
    if(c=='-') f*=-1, c=getchar();
    while(c<'0'&&'9'<c) c=getchar();
    while('0'<=c&&c<='9') 
        x=(x<<3)+(x<<1)+c-'0', c=getchar();
    return f*x;
}

inline void write(int x)
{
    if(x<0) putchar('-'), x*=-1;
    if(x>=10) write(x/10);
    putchar(x%10+'0');
}

const int N=1e5+10, M=N<<1, INF=0x3f3f3f3f;
struct seg {
    int id, l, r; //作品编号 左端点 右端点
    bool operator<(const seg &s1) const {
        return l<s1.l;
    }
};
struct node {
    int id, ticket; //作品编号 得票数
    bool operator>(const node &n1) const {
        if(ticket==n1.ticket) return id<n1.id;
        return ticket>n1.ticket;
    }
}; 
int n, m, q, idx, op; //票数 作品数 事件数 新的编号 操作
int sum[N], fa[M], bh2id[M], idbh[M];
set<seg> st; //线段
set<node, greater<node>> heap; //线段节点

inline int find(int u)
{
    return u==fa[u]?u:fa[u]=find(fa[u]);
}
// #define bh2id(u) (bh2id[u]) //作品编号转节点id
#define id2bh(u) (idbh[find(u)]) //节点id转作品编号

void modify(int x, int l, int r) //编号
{
    auto ita=st.upper_bound({0, l, 0}); //左端点大于l
    auto itb=st.upper_bound({0, r, 0}); //左端点大于r
    ita--; //左端点<=l

    vector<seg> ins; //新插入节点
    vector<set<seg>::iterator> del; //待删除节点
    ins.push_back({bh2id[x], l, r});
    heap.erase(heap.find({x, sum[x]})); //删除编号为x的节点

    sum[x]+=(r-l+1);
    heap.insert({x, sum[x]});

    for(auto it=ita; it!=itb; it++) del.push_back(it);

    for(int i=0; i<del.size(); i++) 
    {
        seg t=*del[i]; //当前该删除的节点
        st.erase(t);
        //在堆中找到当前线段对应作品的节点
        node workid=*heap.find({id2bh(t.id), sum[id2bh(t.id)]});
        heap.erase(workid);
        if(t.l<=l && r<=t.r) //[t.l [l r] t.r]
        {
            if(t.l<=l-1) //l前面还有节点
                ins.push_back({t.id, t.l, l-1});
            if(r+1<=t.r) //r后面还有节点
                ins.push_back({t.id, r+1, t.r});
            sum[workid.id]-=(r-l+1); //更新得票数      
        }
        else if(t.l<=l && l<=t.r) //[t.l [l t.r] r]
        {
            if(t.l<=l-1) //l前面还有节点
                ins.push_back({t.id, t.l, l-1});
            sum[workid.id]-=(t.r-l+1); //更新得票数      
        }
        else if(t.l<=r && r<=t.r) //[l [t.l t.r] r]
        {
            if(r+1<=t.r) //r后面还有节点
                ins.push_back({t.id, r+1, t.r});
            sum[workid.id]-=(r-t.l+1); //更新得票数      
        }
        else if(l<t.l&&t.r<r) //[l [t.l t.r] r]
            sum[workid.id]-=(t.r-t.l+1); //更新得票数      
        
        heap.insert({workid.id, sum[workid.id]});
    }
    for(int i=0; i<ins.size(); i++) //处理待插入列表
        st.insert(ins[i]);
}

void xtoy(int x, int y) //x退出竞选，并将票数转到y下
{
    heap.erase({x, sum[x]}), heap.erase({y, sum[y]});
    fa[bh2id[x]]=bh2id[y];
    fa[idx]=idx;
    bh2id[x]=idx;
    idbh[idx++]=x;
    sum[y]+=sum[x];
    sum[x]=0;
    heap.insert({x, sum[x]}); heap.insert({y, sum[y]}); 
}

void exchange(int x, int y) //编号交换
{
    heap.erase({x, sum[x]}), heap.erase({y, sum[y]});
    int xid=bh2id[x], yid=bh2id[y];
    idbh[xid]=y, idbh[yid]=x;
    swap(bh2id[x], bh2id[y]); swap(sum[x], sum[y]);
    heap.insert({x, sum[x]}); heap.insert({y, sum[y]}); 
}

void init()
{
    n=read(), m=read(); q=read();
    sum[0]=n; //投票意愿为0
    st.insert({0, 1, n});

    for(int i=0; i<=m; i++)
    {
        fa[i]=idbh[i]=bh2id[i]=i;
        heap.insert({i, sum[i]});
    }
    idx=m+1; //已有m+1个节点      
}

void solve()
{
    init();
    while(q--)
    {
        op=read();
        if(op==1)
        {
            int l=read(), r=read(), x=read();
            modify(x, l, r);
        }
        else if(op==2)
        {
            int x=read(), y=read();
            xtoy(x, y);
        }
        else if(op==3)
        {
            int x=read(), y=read();
            exchange(x, y);
        }
        else if(op==4)
        {
            int x=read();
            write(sum[x]); puts("");
        }
        else
        {
            if(sum[0]==n) write(0); 
            else{
                if((*heap.begin()).id) write((*heap.begin()).id);
                else write((*(++heap.begin())).id);    
            }
            puts("");
        }
    }
} 

signed main()
{
    #ifdef DEBUG
        freopen("../in.txt", "r", stdin);
        freopen("../out.txt", "w", stdout);
    #endif

    int T=1; //cin >> T; 
    while(T--) 
    {
        solve();
    }
    return 0;
}